#include <iostream>

class Test
    {
    public:
        Test(int a)
        {
            std::cout<<"构造函数!\n";
            // a = a;   // 不容易区分哪个是成员变量，哪个是形参
            this->a = a;    // 增加代码可读性
        }

        // static没有this指针
        // this指针只能用于非静态成员函数内部
        // 因为静态成员函数不属于某个特定对象，this指针属于某个对象，它指向某个特定对象的地址
        static void func()
        {
            // this;    // 静态成员函数没有this指针
        }

        void show()
        {
            // 如果成员函数的参数也是a，那就不确定这个a是成员变量还是成员函数的参数
            // std::cout << a << std::endl;

            // this指针（关键字）：指向当前对象（存在的目的就是为了区分当前对象是谁，所以之前写的a，其实它隐式地都有一个this指针：this->a）
            // 嵌在编译器里的，也就是由编译器自己进行定义放在里面
            // this指针指向当前对象，当把这个this指针传到函数中去的时候，函数顺着这个this的a就能找到这个a的内存到底在哪，是谁的
            // 这就是成员函数和成员变量能够联动的本质原因，因为它里面嵌了个指针
            printf("this : %p\n", this);
            std::cout << this->a << std::endl;
        }

    private:
        int a; 
    };

int main()
{
    Test t(1);  // 定义一个对象
    // t.show();   // show它的变量
    printf("&t : %p\n", &t);
    t.show();

    return 0;
}